/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package zonasoft.Manejadores;

import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
//import modelo.TipoUsuarioSistema;
import zonasoft.Conceptos.Usuario;
import zonasoft.Vistas.inicioSesion;

/**
 *
 * @author Luis Sierra
 */
public class ManejadorUsuario {

    public static Connection conm;
    Conexion c = new Conexion();
    ManejadorBaseDatos mb = ManejadorBaseDatos.getInstancia();
    Connection con = c.conectar();
    LinkedList lista = new LinkedList();

   

    private Usuario load(ResultSet r) throws SQLException {

        Usuario us = new Usuario();
        us.setId(r.getInt(2));
        us.setLogin_usuario(r.getString(3));
        us.setClave_usuario(r.getString(4));

        return us;
    }

    public int crearUsuario(Usuario u) throws SQLException {

        int bandera=0;
        if (con == null ) {
            throw new SQLException("no hay conexion");
        }
        if(u.getId()!=0)
        {
        PreparedStatement ps=null;
      try {
            con.setAutoCommit(false);
            Statement stmt = con.createStatement();

            java.sql.Date fechaE = new java.sql.Date(u.getFecha_registro().getTime());
            stmt.addBatch("INSERT INTO usuario values(null,"+u.getId()+",'"+u.getLogin_usuario()+"',SHA1("+"'"+u.getClave_usuario()+"'"+"),'"+fechaE+"')");
            stmt.addBatch("INSERT INTO usuario_rol values(null,"+u.getId()+",3)");

            stmt.executeBatch();
            con.commit();

             JOptionPane.showMessageDialog(null," Usuario Registrado exitosamente!", "Informacion",JOptionPane.INFORMATION_MESSAGE);
             bandera=1;
           

            //JOptionPane.showMessageDialog(null,"Usuario Creado correctamente");
        } catch (BatchUpdateException ex) {
            ex.printStackTrace();
            // JOptionPane.showMessageDialog(null,"Excepcion:"+sql,"Error",JOptionPane.INFORMATION_MESSAGE);
        }
        }
        else
        {
            JOptionPane.showMessageDialog(null,"Utilice otro id de usuario");
        }

        return bandera;

    }

    public Usuario iniciarSesionUsuario(String login, String clave_usuario) {
        Usuario us = new Usuario();
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<String> permisos = new ArrayList<String>();
        List<String> historial=new ArrayList<String>(15);
        int id_usurio;
        // TipoUsuarioSistema tiuser=new TipoUsuarioSistema();

        try {
            ps = con.prepareStatement("select * from usuario where login=? and clave=SHA1(?) ");
            ps.setString(1, login);
            ps.setString(2, clave_usuario);
            rs = ps.executeQuery();
            if (rs.next()) {

                // cambios realizados para iniciar by Tilson
//                us.setId(rs.getInt(1));
//                us.setLogin_usuario(rs.getString(2));
//                us.setClave_usuario(rs.getString(3));
//                us.setFecha_registro(Date.valueOf(rs.getString(4)));
                    us.setId(rs.getInt(2));
                    us.setLogin_usuario(rs.getString(3));
                    us.setClave_usuario(rs.getString(4));
                    us.setFecha_registro(Date.valueOf(rs.getString(5)));
               
            }
            id_usurio = us.getId();

            ps = con.prepareStatement("select r.descripcion from usuario_rol as p,roles as r where p.id_usuario=? AND r.id_rol=p.id_rol");
            ps.setString(1, String.valueOf(id_usurio));

            rs = ps.executeQuery();

            while (rs.next()) {
                permisos.add(rs.getString(1));

            }
            us.setPermisos(permisos);


            ps=con.prepareStatement("select * from auditoria where id_usuario =? ORDER BY  id_auditoria DESC");
            ps.setInt(1, id_usurio);
            
            rs=ps.executeQuery();
            SimpleDateFormat formato = new SimpleDateFormat("EEE,d MMM yyyy hh:mm");
            while(rs.next())
            {
                String entrada="";


                entrada="+ "+formato.format(rs.getTimestamp(3))+" al "+formato.format(rs.getTimestamp(4));
                historial.add(entrada);

            }

            us.setHistorial(historial);

            rs.close();
            ps.close();
            con.close();

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }
        return us;
    }

    public static boolean updateUsuario(Usuario u, String id_usuario,int idNuevoRol) throws SQLException {
        if (getUsuario(id_usuario) == null) {
            throw new SQLException("usuario no registrado");
        }
        PreparedStatement pst = null;
        conm.setAutoCommit(false);
        Statement st1=conm.createStatement();
        boolean res = false;
        try {
            pst = conm.prepareStatement("Update usuario set login =?, clave=SHA1(?)  where id_usuario =?");
            st1.addBatch("Update usuario_rol set id_rol = '"+idNuevoRol+"' where id_usuario = '"+u.getId()+"'");
            pst.setInt(3, u.getId());
            pst.setString(1, u.getLogin_usuario());
            pst.setString(2, u.getClave_usuario());

//        java.sql.Date fechaE= new java.sql.Date(u.getFecha_registro().getTime());
//        pst.setDate(4, fechaE);
            int r = pst.executeUpdate();
            st1.executeBatch();
            conm.commit();

            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;
    }

      public static boolean updateUsuarioDesOhabilitar(Usuario u, String id_usuario,int flag) throws SQLException {
        if (getUsuario(id_usuario) == null) {
            throw new SQLException("usuario no registrado");
        }
        PreparedStatement pst = null;
        
        
        boolean res = false;
        try {
            pst = conm.prepareStatement("Update usuario set login =? where id_usuario =?");
           String user=u.getLogin_usuario();
           if(flag==0)
           {
            user+="_";
           }
           else
           {
            if(flag==1)
            {
            user=user.replace("_", "");
            }
           }
            pst.setInt(2, u.getId());
            pst.setString(1, user);

//        java.sql.Date fechaE= new java.sql.Date(u.getFecha_registro().getTime());
//        pst.setDate(4, fechaE);
            int r = pst.executeUpdate();
          

            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;
    }

    public static Vector listarUsuarios() throws Exception {
        try {
            
            Vector<Usuario> usu = new Vector<Usuario>();
           // String sentencia = "Select * from Usuario";
            String sentencia = "Select usuario.id_usuario, usuario.login,usuario.clave,usuario.fecha_registro from usuario, usuario_rol where usuario.id_usuario=usuario_rol.id_usuario and usuario_rol.id_rol!=1";
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            PreparedStatement pstmt = (PreparedStatement) mbd.crearSentencia(sentencia);
            ResultSet filasBD = mbd.consultaFilas(pstmt);
            while (filasBD.next()) {
                Usuario u = Usuario.load2(filasBD);
                usu.add(u);
            }
            return usu;
        } catch (Exception ex) {
            // Logger.getLogger(ManejadorSimpatizante.class.getName()).log(Level.SEVERE, null, ex);
            throw new Exception("Resultado Negativo de la Base de Datos " + ex.getMessage());
        }
    }

    public static Usuario getUsuario(String id_usuario) throws SQLException {

         Usuario user =inicioSesion.userActual;
         List<String> historial=new ArrayList<String>();
        if (id_usuario == null) {
            throw new SQLException("no hay elemento clave en la clase Usuario");
        }
        ResultSet rs = null;
        PreparedStatement pst = null;
        Usuario usuario = null;
        try {
            
            if(user.tieneElRol("superAdministrador"))
            {
                pst = conm.prepareStatement("select * from usuario where id_usuario =?");

            }
            else
            {
            pst = conm.prepareStatement("select * from usuario, usuario_rol where usuario.id_usuario=usuario_rol.id_usuario and usuario_rol.id_rol!=1 and usuario.id_usuario=?");
            }
            pst.setString(1, id_usuario.trim());
            rs = pst.executeQuery();
            while (rs.next()) {

                usuario = Usuario.load(rs);
            }

            pst=conm.prepareStatement("select * from auditoria where id_usuario =? ORDER BY  fecha_entrada DESC");
            pst.setInt(1, Integer.parseInt(id_usuario));

            rs=pst.executeQuery();
            SimpleDateFormat formato = new SimpleDateFormat("hh:mm:ss");
            SimpleDateFormat dia=new SimpleDateFormat("EEE, d MMMM yyyy ");
            while(rs.next())
            {
                String entrada="";


                entrada=".  "+dia.format(rs.getTimestamp(3))+"                  "+formato.format(rs.getTimestamp(3))+"                    "+formato.format(rs.getTimestamp(4));
                historial.add(entrada.toUpperCase());

            }

            usuario.setHistorial(historial);

        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return usuario;
        
        }
    }// fin del getEleccion

     public static Usuario getUsuarioEliminar(String id_usuario) throws SQLException {

         Usuario user =inicioSesion.userActual;
        if (id_usuario == null) {
            throw new SQLException("no hay elemento clave en la clase Usuario");
        }
        if(user.getId()== Integer.parseInt(id_usuario.trim()))
        {
           return null;
        }
        else
        {


        ResultSet rs = null;
        PreparedStatement pst = null;
        Usuario usuario = null;
        try {

            if(user.tieneElRol("superAdministrador"))
            {
                pst = conm.prepareStatement("select * from usuario where id_usuario =?");

            }
            else
            {
            pst = conm.prepareStatement("select * from usuario, usuario_rol where usuario.id_usuario=usuario_rol.id_usuario and usuario_rol.id_rol!=1 and usuario.id_usuario=?");
            }
            pst.setString(1, id_usuario.trim());
            rs = pst.executeQuery();
            while (rs.next()) {

                usuario = Usuario.load(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return usuario;
        }
        }
    }// fin del getEleccion


    public static boolean deleteUsuario(String id) throws SQLException {
        if (getUsuario(id) == null) {
            throw new SQLException("no hay elemento clave de la clase Usuario");
        }
        PreparedStatement pst = null;
        boolean res = false;
        try {
            pst = conm.prepareStatement("delete from usuario where id_usuario = ?");
            pst.setString(1, id.trim());

            int r = pst.executeUpdate();
            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;
    }

       public static int getUsuarioRol(String id_usuario) throws SQLException {
            int rol=-1;
           PreparedStatement pstm=null;
           try {
               pstm=conm.prepareStatement("select id_rol from usuario_rol where id_usuario =?");
               pstm.setString(1, id_usuario.trim());

               ResultSet r=pstm.executeQuery();

               while(r.next())
               {
               rol=Integer.parseInt(r.getString("id_rol"));

               }

           } catch (Exception e) {

               rol=-1;
           }
           return rol;
       
       }

       public  void guardarRegistroDeSesion() throws SQLException {

         Usuario user =inicioSesion.userActual;
        if (con==null) {
             throw new SQLException("no hay conexion");
        }

        PreparedStatement pst = null;
           try {
               pst=con.prepareStatement("INSERT INTO auditoria VALUES(null,?,?,null)");
               pst.setInt(1,user.getId());
               System.out.println("inicioSesion = " + inicioSesion.fechaInicioSesion);
               pst.setTimestamp(2,inicioSesion.fechaInicioSesion);
                           pst.executeUpdate();
           } catch (Exception e) {

               e.printStackTrace();
           }

        
    }

       public static int cantidadByUsuario(int idUsuario) throws SQLException{
         Statement stmt = null;
          ResultSet rs = null;
         int numeroZonificados=0;
         String consulta=("SELECT count(zonificados.idUsuario) FROM zonificacion.zonificados INNER JOIN zonificacion.usuario ON (zonificados.idUsuario = usuario.id_usuario) where usuario.id_usuario = "+idUsuario);
        try {
            stmt = conm.prepareStatement(consulta);
             rs = stmt.executeQuery(consulta);
             while ( rs.next()){
             numeroZonificados = rs.getInt(1);
             }
          }catch(SQLException ex) {
            ex.printStackTrace();
        }finally{
          if( stmt!=null){
              stmt.close();
          }
                  }
   return numeroZonificados;

     }// fin del metodo

       public static int cantidadByUsuario2(int idUsuario) throws SQLException{
         Statement stmt = null;
          ResultSet rs = null;
         int numeroLider=0;
       String consulta =("SELECT count(lider.idUsuario) FROM zonificacion.lider INNER JOIN zonificacion.usuario ON (lider.idUsuario = usuario.id_usuario) where usuario.id_usuario ="+idUsuario);
       try {
            stmt = conm.prepareStatement(consulta);
             rs = stmt.executeQuery(consulta);
             while ( rs.next()){
             numeroLider = rs.getInt(1);
             }
          }catch(SQLException ex) {
            ex.printStackTrace();
        }finally{
          if( stmt!=null){
              stmt.close();
          }
                  }
   return numeroLider;

     }// fin del metodo
}
